{
TÍTULO: Práctica de EDI
SUBTÍTULO: Practica 1
AUTOR: Sergio Morlán Reborido 	LOGIN: infsmr03
GRUPO: E.I
FECHA: 08/05/09
}
UNIT listaEstatica;
INTERFACE

CONST
   NULO=0;
   MaxLista=100;

TYPE
	tPos= NULO..MaxLista;
	tNumeroTelefono = string;
	tOperadorTelefono = string;

	tInfo = RECORD
		NumeroTelefono: tNumeroTelefono;
		OperadorTelefono: tOperadorTelefono;
	END;
	
	 tLista= RECORD
      Datos: ARRAY[1..MaxLista]OF tInfo;
      ultimo: integer;
   END;

PROCEDURE ListaVacia(VAR L:tLista);
FUNCTION esListaVacia(L:tLista):boolean;
FUNCTION Primero(L:tLista):tPos;
FUNCTION Ultimo(L:tLista):tPos;
FUNCTION Siguiente(L:tLista;p:tPos):tPos;
FUNCTION Anterior(L:tLista;p:tPos):tPos;
FUNCTION InsertarOrdenado(VAR L:tLista;num:tNumeroTelefono;oper:tOperadorTelefono):boolean;
PROCEDURE Borrar(VAR L:tLista;p:tPos);
PROCEDURE ObtenerDato(L:tLista;p:tPos;VAR num:tNumeroTelefono;VAR oper:tOperadorTelefono);
PROCEDURE ActualizaDato(VAR L:tLista;p:tPos;oper:tOperadorTelefono);
FUNCTION Buscar(L:tLista;num:tNumeroTelefono):tPos;

IMPLEMENTATION

{Tarea:Crea una lista vacia
Entrada: La lista
Salida:Devuelve la lista creada
}
PROCEDURE ListaVacia(VAR L:tLista);
BEGIN
   L.ultimo:=0
END;

{Tarea:Comprueba si la lista esta vacia
Entrada:Recibe la lista
Salida:Devuelve un true si esta vacia y un false si no lo esta
}
FUNCTION esListaVacia(L:tLista):boolean;
BEGIN
   esListaVacia:=(L.ultimo=0)
END;

{Tarea:Devuelve la posicion del primer elemento de la lista
Entrada:La lista
Salida:Si la lista esta vacia devuelve un nulo
}
FUNCTION Primero(L:tLista):tPos;
BEGIN
   IF NOT esListaVacia(L) THEN Primero:=1
   ELSE Primero:=NULO
END;

{Tarea:Devuelve la posicion del ultimo elemento de la lista
Entrada:Recibe la lista
Salida:Si la lista esta vacia devuelve un nulo
}
FUNCTION Ultimo(L:tLista):tPos;
BEGIN
   IF NOT esListaVacia(L) THEN Ultimo:=L.ultimo
   ELSE Ultimo:=NULO
END;

{Tarea:Devuelve la posicion del siguiente elemento a la posicion indicada
Entrada:Recibe la lista y la posicion de la que hay que devolver el siguiente elemento
Salida:Nulo si la posicion recibida no tiene siguiente
PreCD:La posicion debe ser valida 
}
FUNCTION Siguiente(L:tLista;p:tPos):tPos;
BEGIN
   IF p<L.ultimo THEN Siguiente:=p+1
   ELSE Siguiente:=NULO
END;

{Tarea:Devuelve la posicion del anterior elemento a la posicion indicada
Entrada:Recibe la lista y la posicion de la que hay que devolver el anterior elemento
Salida:Nulo si la posicion recibida no tiene anterior
PreCD:La posicion debe ser valida 
}
FUNCTION Anterior(L:tLista;p:tPos):tPos;
BEGIN
   IF p=Primero(L) THEN Anterior:=NULO
   ELSE Anterior:=p-1
END;

{Tarea:Insertar en la lista los numeros de telefono y el operador de forma ordenada por el numero de telefono
Entrada:Recibe la lista, el numero de telefono y el operador a insertar
Salida:La lista con el dato insertado, y un booleano para saber si el dato fue insertado
PreCD:No debe existir ya un elemento en la lista con ese numero de telefono
}
FUNCTION InsertarOrdenado(VAR L:tLista;num:tNumeroTelefono;oper:tOperadorTelefono):boolean;
VAR p:tPos;
BEGIN
   IF L.ultimo=MaxLista THEN InsertarOrdenado:=FALSE
   ELSE BEGIN
		L.ultimo:=L.ultimo +1;
		p:=L.ultimo;
      WHILE (p<>1) AND (L.Datos[p-1].NumeroTelefono>=num) DO BEGIN
			L.Datos[p]:=L.Datos[p-1];
			p:=Anterior(L,p);
		END;
		L.Datos[p].NumeroTelefono:=num;
		L.Datos[p].OperadorTelefono:=oper;
		InsertarOrdenado:=TRUE;
	END;
END;

{Tarea:Borra de la lista el elemento que esta en la posicion indicada,pasando los datos que estan en posiciones superiores y decrementando 1 la posicion del ultimo
Entrada:Recibe la lista y la posicion del elemento a borrar
Salida:La lista con el dato borrado
PreCD:La posicion debe ser valida
}
PROCEDURE Borrar(VAR L:tLista;p:tPos);
VAR i:tPos;
BEGIN
   FOR i:=p TO L.Ultimo-1 DO L.Datos[i]:=L.Datos[i+1];
   	L.ultimo:=L.ultimo-1;
END;

{Tarea:Obtener toda la informacion de la posicion indicada
Entrada:Recibe la lista,la posicion,el numero de telefono y el operador
Salida:El numero de telefono yel operador de esa posicion
PreCD:La posicion tiene que ser válida
}
PROCEDURE ObtenerDato(L:tLista;p:tPos;VAR num:tNumeroTelefono;VAR oper:tOperadorTelefono);
BEGIN
   num:=L.Datos[p].NumeroTelefono;
   oper:=L.Datos[p].OperadorTelefono;
END;

{Tarea:Actualiza los datos en la posicion indicada
Entrada:Recibe la lista, la posicion y el operador de telefeno
Salida:La lista con el operador actualizado en la posicion correspondiente
PreCD:La posicion tiene que ser valida
}
PROCEDURE ActualizaDato(VAR L:tLista;p:tPos;oper:tOperadorTelefono);
BEGIN
   L.Datos[p].OperadorTelefono:=oper;
END;

{Tarea:Busca en la lista la posicion del elemento cuyo numero telefono coincida con el recibido
Entrada:Recibe la lista y el numero de telefono a buscar en ella
Salida:Nulo si el elemento no se encontro
}
FUNCTION Buscar(L:tLista;num:tNumeroTelefono):tPos;
VAR p:tPos;
BEGIN
   IF esListaVacia(L) THEN Buscar:=NULO
   ELSE BEGIN
      p:=Primero(L);
      WHILE (p<>NULO) AND (L.Datos[p].NumeroTelefono<>num) DO p:=Siguiente(L,p);
         Buscar:=p;
   END
END;

BEGIN

END.





